package com.zhongge.shuffle;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * @ClassName CardGame
 * @Description TODO 玩牌（操作牌）
 * @Author zhongge
 * @Version 1.0
 */
@SuppressWarnings("all")
public class CardGame {
    //首先将花色存起来(花色是不变的，所以设置为常量)
    private static final String[] suits = {"♥", "♦", "♣", "♠"};

    //去买一副牌回来
    /**
     * 产生一副牌
     * @return 返回买到的这副牌
     */
    public List<Card> buyCard() {
        //使用一个容器用于存储这副牌
        List<Card> cardList = new ArrayList<>();
        //4种花色 13中面值 使用循环嵌套
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                //得到花色
                String suit = suits[i];
                //得到面值
                int faceVal = j;
                //创建出一张牌对象
                Card card = new Card(suit, faceVal);
                //将这张牌放入容器
                cardList.add(card);
            }
        }
        //返回容器
        return cardList;
    }

    //一旦有了牌我们就可以洗牌了

    /**
     * 洗牌
     * @param cardList 将容器中的牌进行打乱
     */
    public void shuffle(List<Card> cardList) {
        //如何打乱?
        /*
        1、使得i从后面往前走
        2、每次随机产生i之内的随机下标
        3、将i处的值与随机下标的值进行交换
         */
        for (int i = cardList.size() - 1; i > 0; i--) {
            Random random = new Random();
            //产生随机下标
            int j = random.nextInt(i);//注意：因为nextInt中参数不为0所以这里 循环条件才是 i>0
            //交换 i j 处的值
            swap(cardList, i, j);
        }
    }

    /**
     * 交换两个数
     * @param cardList 在该容器中交换
     * @param i
     * @param j
     */
    private void swap(List<Card> cardList, int i, int j) {
        //首先使用临时变量将i处的值存起来
        Card tmp = cardList.get(i);
        //将j处的值覆盖i处的值
        cardList.set(i, cardList.get(j));
        //将临时变量中的tmp值覆盖j处的值
        cardList.set(j, tmp);
    }

}
